package 排序;

public class 冒泡排序 {


    public static void bubbleSort(int[] a) {
        // 冒泡排序的最大的特点就是顺序是从右往前逐渐有序的
        // 所以，随着排序的逐渐执行，右边的越来越有序，但是每一次比较缺还在比较已经有序的部分
        // 因此需要排除遍历这部分有序的数据，也就是内循环只遍历到右边有序数据的前面就行了，不能再往后遍历了
        int sortedBorder = a.length - 1;
        // 这个 lastSwapIndex 肯定是从大数开始减少的，代表着右边的数据在排序
        int lastSwapIndex = 0;
        for (int i = 0; i < a.length; i++) {
            boolean isSorted = true;
            for (int j = 0; j < sortedBorder; j++) {
                if (a[j] > a[j + 1]) {
                    a[j] ^= a[j + 1];
                    a[j + 1] ^= a[j];
                    a[j] ^= a[j + 1];
                    isSorted = false;
                    lastSwapIndex = j;
                }
            }
            // 内循环遍历结束，代表着，右边已经部分有序了，最后一次排序的 j 就是有序无序的边界
            sortedBorder = lastSwapIndex;
            if (isSorted) {
                break;
            }
        }
    }


    public static void main(String[] args) {
        int[] arr = {6, 3, 8, 2, 9, 1, 0, 5, 4, 7, -1};
//        int[] arr = {6, 3, 8, 12, 19, 110};
//        int[] arr = {0, 3, 8, 12, 19, 110};
        System.out.println("排序前数组为：");
        for (int num : arr) {
            System.out.print(num + " ");
        }

        bubbleSort(arr);

        System.out.println();
        System.out.println("排序后的数组为：");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}
